package code1.binary_tree;

/**
 * 原题链接：https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/
 */
public class P236 {

    //求最近公共祖先

    //二叉树回溯的过程就是从低到上,后序遍历（左右中）就是天然的回溯过程，可以根据左右子树的返回值，来处理中节点的逻辑。
    //思路：如果找到一个节点，发现左子树出现结点p，右子树出现节点q，或者 左子树出现结点q，右子树出现节点p，那么该节点就是节点p和q的最近公共祖先。

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==p || root==q || root==null){
            return root;
        }
        //搜索左右子树，返回值要么是p,要么是q，要么是他们的最近公共祖先，要么是null
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if(left!=null && right!=null){
            return root;
        }else if(left!=null && right==null){
            return left;
        }else if(left==null && right!=null){
            return right;
        }else{
            return null;
        }
    }
}
